
#include<iostream>

using namespace std;

////////////////////////

//这种情况下并未构成多态
//构成多态需要两种情况
//1.虚函数重写，重写要三同
//2.要使用父类的指针或者引用进行调用

/*class A{
  public:
    void Func(){
      cout<<"Func_A"<<endl;
    }

};

class B : public A{
  public:
    void Func(){
      cout<<"Func_B"<<endl;
    }

};
*/

//------------------------

/*class A{
  public:
    void virtual Func(){//这里实际上实现了重写，也就是形成了多态
    //可以理解为：当基类的某个成员函数具备虚性时，其派生类中若是存在同名函数（参数列表相同，函数名相同，返回值类型相同）的情况下或是使用virtual关键字进行修饰的情况下才具备虚性;----不建议这么写    
    cout<<"Func_A"<<endl;
    
    }

};

class B : public A{
  public:
    void Func(){
      cout<<"Func_B"<<endl;
    }

};


void Func1(A& aa){
  aa.Func();
}

void test1(){
  A _a;
  B _b;
  Func1(_a);
  Func1(_b);
}
*/

//----------------------

class A{
  public:
    void virtual Func(){
      cout<<"Func_A"<<endl;
    }

  //  ~A(){//若是没有使用virtual进行修饰的话在Func函数中使用delete进行析构时将会根据类型去析构而不是根据对象去析构；
  virtual  ~A(){
      cout<<"~A"<<endl;
    }
};

class B : public A{
  public:
    void Func(){
      cout<<"Func_B"<<endl;
    }



    ~B(){
      cout<<"~B"<<endl;

    
    }

};


void Func1(A* aa){
  aa->Func();
  delete aa;
}

void test1(){
  Func1(new A);
  Func1(new B);
}
//////////////////////////// 
int main()
{
  test1();

  return 0;

}
